# -*- coding: utf-8 -*-
import operator
from formencode.validators import FancyValidator, Invalid

__all__ = ["CEP"]

class CEP(FancyValidator):
    u"""
    Esta classe é responsável por validar um CEP.

    A utilização dá-se como para outros validadores do FormEncode, o que permite
    que este validador seja usado em conjunto com outros não providos aqui ou
    então em regras mais complexas de validação.


    Parâmetros:

    value    -> valor que sofrerá a ação
    messages -> dicionário contendo as mensagens de erro
    format_output -> informa se o valor retornado deve ou não ser formatado com
                     "-" para a exibição
    allow_missing_format -> informa se números como "12345000" devem ou não
                            ser aceitos
    """

    format_output = True
    allow_missing_format = True
    messages = {
        'empty': 'Por favor entre com um CEP',
        'invalid': 'CEP invalido',
        'size': 'Numero de digitos incorreto',
        'format': 'Formatacao do numero incorreta',
        }

    def _to_python(self, value, state):
        self.assert_string(value, state)

        original = value
        value = value.replace('.', '').replace('-', '').replace('/', '')

        if not value.isdigit():
            raise Invalid(self.message('invalid', state), value, state)

        if not len(value) == 8:
            raise Invalid(self.message('size', state), value, state)

        if len(original) == 9:
            if not self.allow_missing_format or original[5] <> '-':
                raise Invalid(self.message('format', state), value, state)

        if not len(original) in [8,9]:
            raise Invalid(self.message('format', state), value, state)

        return value


    def _from_python(self, value, state):
        if len(value) == 8 and self.format_output:
            return "%s-%s" % (value[0:5], value[5:8])
        else:
            # Assume-se que o valor vem de uma fonte "correta" e pode chegar
            # ao usuário desta forma.
            return value
